package cn.tedu.product.service;

import cn.tedu.product.mapper.ProductMapper;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.jt.common.pojo.Product;
import com.jt.common.utils.MapperUtil;
import com.jt.common.utils.UUIDUtil;
import com.jt.common.vo.EasyUIResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import redis.clients.jedis.JedisCluster;

import java.util.List;

@Service
public class ProductService {
    @Autowired
    ProductMapper pm;

    @Autowired
    JedisCluster jedisCluster;

    public EasyUIResult queryProductByPage(Integer page, Integer rows) {
        EasyUIResult result = new EasyUIResult();
        int total = pm.selectProductTotal();
        result.setTotal(total);
        // 利用page, rows做分页查询语句，查询List<Product>
        int start = (page - 1) * rows;
        List<Product> pList = pm.selectProductByPage(start, rows);
        result.setRows(pList);
        return result;
    }

    public Product queryOneProduct(String productId) {
        // product数据在redis存储结构 string类型 json key值保证商品数据唯一性 produt
        String productKey = "product_" + productId;
        try {
            ObjectMapper mp = MapperUtil.MP;
            // 使用集群判断商品数据是否存在
            if (jedisCluster.exists(productKey)) {
                // 如果进入，说明能够从redis集群获取商品数据
                // 可以通过key值返回json字符串
                String pJson = jedisCluster.get(productKey);
                // 将json转化为对象
                Product product = mp.readValue(pJson, Product.class);
                return product;
            } else {
                // 说明缓存未命中，到数据库查询数据
                Product product = pm.selectProductById(productId);
                // 将product对象转化为json放到redis
                String pJson = mp.writeValueAsString(product);
                jedisCluster.setex(productKey, 60 * 60 * 24, pJson);
                return product;
            }
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    /**
     * 新增商品
     * @param product
     */
    public void saveProduct(Product product) {
        // 补齐ID
        String productId = UUIDUtil.getUUID();
        // 一台服务器生成的uuid每次一定不一样
        // 服务器集群生成的uuid有可能一样(几率极低)
        product.setProductId(productId);

        try {
            ObjectMapper mp = MapperUtil.MP;
            String productKey = "product_" + productId;
            String pJson = mp.writeValueAsString(product);
            jedisCluster.setex(productKey, 60 * 60 * 24, pJson);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            pm.insertProduct(product);
        }
    }

    /**
     * 修改商品
     * @param product
     */
    public void updateProduct(Product product) {
        // 保证更新商品与缓存数据一致
        // 更新之前将商品缓存数据删除
        String productKey = "product_" + product.getProductId();
        jedisCluster.del(productKey);
        pm.updateProductById(product);
    }

    public List<Product> queryAllProduct() {
        return pm.selectAllProduct();
    }
}
